package com.sywb.chuangyebao.utils;

import org.bining.footstone.log.Logger;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public abstract class HttpCallback<T> {

    public Object data;
    public String msg;

    /**
     * 泛型类型
     */
    public Type type;

    public HttpCallback() {
        this(null);
    }

    public HttpCallback(Object data) {
        this.data = data;
        this.type = getSuperclassTypeParameter(getClass());
    }

    static Type getSuperclassTypeParameter(Class<?> subclass) {
        //xyz.tanwb.airship.okgo.convert.JsonConvert<List<Abs>> 得到类的泛型，包括了泛型参数
        Type superclass = subclass.getGenericSuperclass();
        if (superclass instanceof Class) {
            return null;
        }
        //从上述的类中取出真实的泛型参数，有些类可能有多个泛型，所以是数值
        Type[] params = ((ParameterizedType) superclass).getActualTypeArguments();
        //JsonConvert只接收一个泛型，所以取出第一个，得到如下结果 List<Abs>
        return params[0];

        // https://github.com/jeasonlzy/okhttp-OkGo/blob/master/README_JSONCALLBACK.md 这里的第一种方式定义就可以实现
        // if (!(type instanceof ParameterizedType)) throw new IllegalStateException("没有填写泛型参数");
        // 如果确实还有泛型，那么我们需要取出真实的泛型，得到如下结果 class com.lzy.demo.model.LzyResponse
        // 此时，rawType的类型实际上是 class，但 Class 实现了 Type 接口，所以我们用 Type 接收没有问题
        // Type rawType = ((ParameterizedType) type).getRawType();
        // 这里获取最终内部泛型的类型 com.lzy.demo.model.ServerModel
        // Type typeArgument = ((ParameterizedType) type).getActualTypeArguments()[0];
    }

    /**
     * 请求网络开始前，UI线程
     */
    public void onStart() {
        Logger.e("onStart");
    }

    /**
     * 对返回数据进行操作的回调， UI线程
     */
    public abstract void onSuccess(T t);

    /**
     * 请求失败，响应错误，数据解析错误等，都会回调该方法， UI线程
     */
    public void onError(String strMsg) {
        Logger.e("Error message " + strMsg);
    }

    /**
     * 请求网络结束后，UI线程
     */
    public void onFinish() {
        Logger.e("onFinish");
    }

    /**
     * 执行下载或Post执行上传过程中的进度回调，get请求不回调，UI线程
     *
     * @param currentSize  当前上传的字节数
     * @param totalSize    总共需要上传的字节数
     * @param progress     当前上传的进度
     * @param networkSpeed 当前上传的速度 字节/秒
     */
    public void onLoading(long currentSize, long totalSize, float progress, long networkSpeed) {
        Logger.e("currentSize:" + currentSize + " totalSize:" + totalSize + " progress:" + progress + " networkSpeed:" + networkSpeed);
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

}
